/*
 * Copyright (C) Gustav Karlsson
 *
 * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 *
 * <p>http://www.apache.org/licenses/LICENSE-2.0
 *
 * <p>Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.github.kagkarlsson.scheduler.task;

import java.time.Instant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public interface DeadExecutionHandler<T> {
  void deadExecution(
      ExecutionComplete executionComplete, ExecutionOperations<T> executionOperations);

  class ReviveDeadExecution<T> implements DeadExecutionHandler<T> {
    private static final Logger LOG = LoggerFactory.getLogger(ReviveDeadExecution.class);

    @Override
    public void deadExecution(
        ExecutionComplete executionComplete, ExecutionOperations<T> executionOperations) {
      final Instant now = Instant.now();
      LOG.info("Reviving dead execution: " + executionComplete.getExecution() + " to " + now);
      executionOperations.reschedule(executionComplete, now);
    }
  }

  class CancelDeadExecution<T> implements DeadExecutionHandler<T> {
    private static final Logger LOG = LoggerFactory.getLogger(CancelDeadExecution.class);

    @Override
    public void deadExecution(
        ExecutionComplete executionComplete, ExecutionOperations<T> executionOperations) {
      LOG.warn("Cancelling dead execution: " + executionComplete.getExecution());
      executionOperations.stop();
    }
  }
}
